| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 
 | #include<iostream>#include<cstdio>
 using namespace std;
 typedef long long LL;
 struct node {
 int op,L,R,idx;
 LL val;
 } qu[50005],q1[50005],q2[50005];
 int ans[50005],cnt;
 LL c1[50005],c2[50005];
 int n,m;
 inline LL read() {
 LL sum=0;char ch=0;int f=1;
 while ((ch>'9' || ch<'0')&&(ch!='-')) ch=getchar();
 if (ch=='-') f=-1,ch=getchar();
 while (ch>='0' && ch<='9') sum=sum*10+ch-'0',ch=getchar();
 return sum*f;
 }
 inline int lowbit(int x) {return x&(-x);}
 inline void update(int x,LL val) {
 LL tmp=x*val;
 for (;x<=n;x+=lowbit(x)) c1[x]+=val,c2[x]+=tmp;
 }
 inline LL getsum(int x) {
 LL a=0,b=0,tmp=x+1;
 for (;x>0;x-=lowbit(x)) a+=c1[x],b+=c2[x];
 return a*tmp-b;
 }
 inline void Update(int l,int r,LL val) {
 update(l,val);
 update(r+1,-val);
 }
 inline LL query(int l,int r) {
 return getsum(r)-getsum(l-1);
 }
 void solve(int l,int r,int s,int t) {
 if (s>t) return;
 if (l==r) {
 for (int i=s;i<=t;i++)
 if (qu[i].op==2) ans[qu[i].idx]=l;
 return;
 }
 int mid=(l+r)>>1;
 int s1=0,s2=0;
 for (int i=s;i<=t;i++) {
 if (qu[i].op==1) {
 if (qu[i].val>mid) {
 Update(qu[i].L,qu[i].R,1);
 q2[++s2]=qu[i];
 }
 else q1[++s1]=qu[i];
 }
 else {
 LL tmp=query(qu[i].L,qu[i].R);
 if (tmp<qu[i].val) {
 qu[i].val-=tmp;
 q1[++s1]=qu[i];
 }
 else q2[++s2]=qu[i];
 }
 }
 for (int i=s;i<=t;i++) {
 if (qu[i].op==1 && qu[i].val>mid) Update(qu[i].L,qu[i].R,-1);
 }
 for (int i=1;i<=s1;i++) qu[s+i-1]=q1[i];
 for (int i=1;i<=s2;i++) qu[t-s2+i]=q2[i];
 solve(l,mid,s,s+s1-1);
 solve(mid+1,r,s+s1,t);
 }
 int main() {
 n=read();m=read();int mx=0,mn=1e9;
 for (int i=1;i<=m;i++) {
 qu[i].op=read();qu[i].L=read();
 qu[i].R=read();qu[i].val=read();
 if (qu[i].op==2) qu[i].idx=++cnt;
 else mx=max(mx,(int)qu[i].val),mn=min(mn,(int)qu[i].val);
 }
 solve(mn,mx,1,m);
 for (int i=1;i<=cnt;i++) printf("%d\n",ans[i]);
 return 0;
 }
 
 |